
#include "common.h"
#include "stm32f0xx_ll_adc.h"
#include "stm32f0xx_ll_bus.h"
#include "GPIO.h"

void GPIO_OUT_init(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t outmode)
{
	LL_GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.Pin = PinMask;
	GPIO_InitStruct.Mode = outmode;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
	LL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}

void GPIO_INUP_Init(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
	LL_GPIO_InitTypeDef GPIO_InitStruct;

	// GPIO INPUT INIT
	GPIO_InitStruct.Pin = PinMask;
	GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	LL_GPIO_Init(GPIOx, &GPIO_InitStruct);

}

void gpio_pulldown_int(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
	LL_GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.Pin = PinMask;
	GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	LL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}

void key_gpio_init(void)
{
	GPIO_INUP_Init(GPIOA, LL_GPIO_PIN_15); //p12:down; p15: power key
	GPIO_INUP_Init(GPIOB, LL_GPIO_PIN_4); // p3: ok key; p4: main key; p5: shut/pease key
}

void oled_init(void)
{
	GPIO_OUT_init(GPIOB, LL_GPIO_PIN_1, LL_GPIO_MODE_OUTPUT);
	GPIO_OUT_init(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_OUTPUT);
}

void Gpio_init(void)
{  
	LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
  GPIO_OUT_init(GPIOB, LL_GPIO_PIN_9, LL_GPIO_MODE_OUTPUT);
  
  key_gpio_init();

  LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_9);
  oled_init();
}

uint8_t key_check(void)
{
	uint32_t times = 0;
	uint32_t debug = 0;
	
	if(PWR_KEY && MAIN_KEY)
	{
		for(times=0;times<5000000;times++)
		{
			debug += 1;
			if(debug == 200000)
			{
				debug = 0;
				if(PWR_KEY==0 || MAIN_KEY==0)break;
			}

		}
		
		if(PWR_KEY && MAIN_KEY)
		{
			force_updata = 0xcc;
			LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_1);
			LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_9);
		}
	}
}



